#Python 制作动画可视化效果，让数据不再枯燥！

import os
import numpy as np
import matplotlib.pyplot as plt
import imageio

"""
输出折现图
"""
def zhexian():
    # 生成40个取值在30-40的数
    y = np.random.randint(30, 40, size=(40))
    # 绘制折线
    plt.plot(y)
    # 设置y轴最小值和最大值
    plt.ylim(20, 50)

    # 显示
    plt.show()

"""
#下面将对整数列表进行切片，生成不同阶段的图表。
#将对整数列表进行切片，生成不同阶段的图表。
"""
def zhexianArray():
    # 生成40个取值在30-40的数
    y = np.random.randint(30, 40, size=(40))
    # 第一张图
    plt.plot(y[:-3])
    plt.ylim(20, 50)
    plt.savefig('1.png')
    plt.show()

    # 第二张图
    plt.plot(y[:-2])
    plt.ylim(20, 50)
    plt.savefig('2.png')
    plt.show()

    # 第三张图
    plt.plot(y[:-1])
    plt.ylim(20, 50)
    plt.savefig('3.png')
    plt.show()

    # 第四张图
    plt.plot(y)
    plt.ylim(20, 50)
    plt.savefig('4.png')
    plt.show()

    # 生成Gif
    with imageio.get_writer('mygif.gif', mode='I') as writer:
        for filename in ['1.png', '2.png', '3.png', '4.png']:
            image = imageio.imread(filename)
            writer.append_data(image)



"""
条形图
上面的折线图每次只有一个y值即可，而条形图则需要所有的y值，如此所有的条形才能同时移动。
给X轴创建固定值，Y轴创建列表，并使用Matplotlib的条形图函数。
给图表添加了背景色、条形图上色、去除边框、增加网格线
"""
def bar():
    n_frames = 10
    bg_color = '#95A4AD'
    bar_color = '#283F4E'
    gif_name = 'bars'
    x = [1, 2, 3, 4, 5]
    coordinates_lists = [[0, 0, 0, 0, 0],
                         [10, 30, 60, 30, 10],
                         [70, 40, 20, 40, 70],
                         [10, 20, 30, 40, 50],
                         [50, 40, 30, 20, 10],
                         [75, 0, 75, 0, 75],
                         [0, 0, 0, 0, 0]]
    print('生成图表\n')
    filenames = []
    for index in np.arange(0, len(coordinates_lists) - 1):
        y = coordinates_lists[index]
        y1 = coordinates_lists[index + 1]
        y_path = np.array(y1) - np.array(y)
        for i in np.arange(0, n_frames + 1):
            y_temp = (y + (y_path / n_frames) * i)
            # 绘制条形图
            fig, ax = plt.subplots(figsize=(8, 4))
            ax.set_facecolor(bg_color)
            plt.bar(x, y_temp, width=0.4, color=bar_color)
            plt.ylim(0, 80)
            # 移除图表的上边框和右边框
            ax.spines['right'].set_visible(False)
            ax.spines['top'].set_visible(False)
            # 设置虚线网格线
            ax.set_axisbelow(True)
            ax.yaxis.grid(color='gray', linestyle='dashed', alpha=0.7)
            # 保存每一帧的图像
            filename = f'./images/frame_{index}_{i}.png'
            filenames.append(filename)

            # 最后一帧重复,画面停留一会
            if (i == n_frames):
                for i in range(5):
                    filenames.append(filename)
            # 保存图片
            plt.savefig(filename, dpi=96, facecolor=bg_color)
            plt.close()
    print('保存图表\n')
    # 生成GIF
    print('生成GIF\n')
    with imageio.get_writer(f'{gif_name}.gif', mode='I') as writer:
        for filename in filenames:
            image = imageio.imread(filename)
            writer.append_data(image)
    print('保存GIF\n')
    print('删除图片\n')
    # 删除图片
    for filename in set(filenames):
        os.remove(filename)
    print('完成')


if __name__ == '__main__':
    #zhexian()
    #zhexianArray()
    bar()